#ifndef __OE_TYPES_HEADER__
#define __OE_TYPES_HEADER__

/////////////////////////////////////////////////////////////////////
// Standard include files
#include <string>
#include <vector>

/////////////////////////////////////////////////////////////////////
// User-Defined include files

namespace OE
{

    typedef bool			OEBool;
    typedef char			OEChar;

    // real types
    typedef float			OEReal32;
    typedef double			OEReal64;

    // signed versions
    typedef signed char		OEInt8;
    typedef short int		OEInt16;
    typedef int				OEInt32;
    typedef long int		OEInt64;

    // unsigned versions
    typedef unsigned char	OEUInt8;
    typedef unsigned short	OEUInt16;
    typedef unsigned int	OEUInt32;
    typedef unsigned long	OEUInt64;

    typedef std::string		OEString;

    // type-specific vectors
    typedef std::vector<OEBool>		OEBoolSeq;
    typedef std::vector<OEChar>		OECharSeq;

    typedef std::vector<OEReal32>	OEReal32Seq;
    typedef std::vector<OEReal64>	OEReal64Seq;

    typedef std::vector<OEInt8>		OEInt8Seq;
    typedef std::vector<OEInt16>	OEInt16Seq;
    typedef std::vector<OEInt32>	OEInt32Seq;
    typedef std::vector<OEInt64>	OEInt64Seq;

    typedef std::vector<OEUInt8>	OEUInt8Seq;
    typedef std::vector<OEUInt16>	OEUInt16Seq;
    typedef std::vector<OEUInt32>	OEUInt32Seq;
    typedef std::vector<OEUInt64>	OEUInt64Seq;

    typedef std::vector<OEString>	OEStringSeq;

    struct OEResult
    {
      public:
        OEResult () : m_errorCode (0) { };
        OEResult (OEUInt32 err) : m_errorCode (err) { };
        OEResult (const OEResult& other) : m_errorCode (other.m_errorCode) { };

        OEUInt32 getErrorCode () { return m_errorCode; };
        operator bool () { return m_errorCode==0; };

        operator = (SCAUInt32 errCode) { m_errorCode = errCode; };
        operator = (const OEResult& otherErr) { m_errorCode = otherErr.m_errorCode; };

      private:
        OEUInt32 m_errorCode;
    };

};

#endif /* __OE_TYPES_HEADER__ */
